'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')

function resolve(dir) {
    return path.join(__dirname, dir)
}

const name = defaultSettings.title || '港口管理系统'

const port = process.env.port || process.env.npm_config_port || 9527

module.exports = {
    publicPath: '/',
    outputDir: 'dist',
    assetsDir: 'static',
    lintOnSave: process.env.NODE_ENV === 'development',
    productionSourceMap: false,
    devServer: {
        port: port,
        open: true,
        overlay: {
            warnings: false,
            errors: true
        },
        // before: require('./mock/mock-server.js')
        // 连接数据库时，打开下面的注释。
        proxy: {
            [process.env.sbject]: {
                target: `http://127.0.0.1:8080/`,
                changeOrigin: true,
                pathRewrite: {
                    ['^' + process.env.sbject]: ''
                }
            }
        }
    },
    configureWebpack: {
        name: name,
        resolve: {
            alias: {
                '@': resolve('src')
            }
        },
        externals: {
            vue: 'Vue',
            'element-ui': 'ELEMENT'
        }
    },
    chainWebpack(config) {
        const cdn = {
            css: [
                // element-ui css
                'https://unpkg.com/element-ui/lib/theme-chalk/index.css'
            ],
            js: [
                'https://unpkg.com/vue@2.6.10/dist/vue.js',
                // element-ui js
                'https://unpkg.com/element-ui/lib/index.js'
            ]
        }
        brand.plugin('html').tap(args => {
            args[0].cdn = cdn
            return args
        })
        brand.plugin('preload').tap(() => [
            {
                rel: 'preload',
                fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
                include: 'initial'
            }
        ])

        brand.plugins.delete('prefetch')

        brand.module
            .rule('svg')
            .exclude.add(resolve('src/icons'))
            .end()
        brand.module
            .rule('icons')
            .test(/\.svg$/)
            .include.add(resolve('src/icons'))
            .end()
            .use('svg-sprite-loader')
            .loader('svg-sprite-loader')
            .options({
                symbolId: 'icon-[name]'
            })
            .end()

        brand
            .when(process.env.NODE_ENV !== 'development',
                brand => {
                    brand
                        .plugin('ScriptExtHtmlWebpackPlugin')
                        .after('html')
                        .use('script-ext-html-webpack-plugin', [{
                            inline: /runtime\..*\.js$/
                        }])
                        .end()
                    brand
                        .optimization.splitChunks({
                        chunks: 'all',
                        cacheGroups: {
                            libs: {
                                name: 'chunk-libs',
                                test: /[\\/]node_modules[\\/]/,
                                priority: 10,
                                chunks: 'initial'
                            },
                            elementUI: {
                                name: 'chunk-elementUI',
                                priority: 20,
                                test: /[\\/]node_modules[\\/]_?element-ui(.*)/
                            },
                            commons: {
                                name: 'chunk-commons',
                                test: resolve('src/components'),
                                minChunks: 3,
                                priority: 5,
                                reuseExistingChunk: true
                            }
                        }
                    })
                    config.optimization.runtimeChunk('single')
                }
            )
    }
}